#pragma once

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <cstring>

class Util
{
public:
    // 读取指定路径下的文件内容函数
    static bool ReadFileContent(const std::string &filename, std::string *out)
    {
        /* std::ifstream in(filename);
        if (!in.is_open())
        {
            return false; // 读取失败
        }
        std::string line; // 临时存放每一行内容
        while (std::getline(in, line))
        {
            *out += line;
        }

        in.close();
        return true; // 读取成功 */

        // version2 : 以二进制方式进行读取
        int filesize = FileSize(filename);
        if(filesize > 0)
        {
            std::ifstream in(filename);
            if(!in.is_open())
                return false;
            out->resize(filesize);
            in.read((char*)(out->c_str()), filesize);
            in.close();
        }
        else
        {
            return false;
        }

        return true;
    }

    // 从长字符串中提取第一行函数
    static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep)
    {
        auto pos = bigstr.find(sep); // 查找sep分隔符位置
        if(pos == std::string::npos)
        {
            return false; // 没有找到分隔符
        }
        *out = bigstr.substr(0, pos); // 提取第一行内容

        bigstr.erase(0, pos + sep.size()); // 擦除已经提取的内容和分隔符

        return true; // 提取成功
    }

    // 计算文件大小
    static int FileSize(const std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary);
        if(!in.is_open())
            return -1;
        in.seekg(0, in.end);
        int filesize = in.tellg();
        in.seekg(0, in.beg);
        in.close();
        return filesize;
    }
};